package com.cskaoyan.javase._2inner._6lambda._2notice;

/**
 * 注意事项:
 *      1.Lambda表达式是特殊的局部内部类(是接口匿名内部类的简化)
 *          所以Lambda表达式如果访问作用域内部的局部变量, 那么该局部变量是一个常量.
 *
 *      2.局部内部类,匿名内部类,大括号内部都有自身独立的作用域
 *          但Lambda表达式没有自身独立的作用
 *          它和装着它的大括号共用同一个作用域.
 *
 *      3.方法引用的使用:
 *          除了可以自定义手写一个实现方法
 *          所有已经实现的方法都可以作为Lambda表达式实现
 *          比如jdk源码中的方法,三方工具包中的方法.
 *
 * @since 09:38
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int num = 100;
        /*{
            int num = 100;
        }*/
        IA i = new IA() {
            int num;
            @Override
            public Object test(int a) {
                int num;
                return null;
            }
        };
        IA ia = a -> {
            System.out.println(a);
            System.out.println("hello world!");
            System.out.println(num);
            // Variable 'num' is already defined in the scope
            // int num = 200;
            // num = 777;
            return "666";
        };
        System.out.println(ia.test(777));
        System.out.println("--------------------------");

        IA ia2 = Demo::myTest;
        // Lambda can be replaced with method reference
        IA ia3 = a -> myTest(a);
        System.out.println(ia2.test(888));
    }

    public static String myTest(int num){
        System.out.println(num);
        System.out.println("今天是周一,美好的一周又开始了!");
        return "666";
    }
}

@FunctionalInterface
interface IA {
    Object test(int a);
}
